<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // typeof 
        // 只能基本数据类型 

        // instanceof
        // 可以复杂数据类型  null 和undefined 检测不出来 

        // console.log(typeof 123);
        // console.log(typeof 'abc');
        // console.log(typeof true);
        // console.log(typeof null);
        // console.log(typeof undefined);

        // var a;
        // alert(typeof a);

        // console.log(typeof [1,2,3]);
        // console.log(typeof {name:'zhangsan'});
        // console.log(typeof /abc/);
        // console.log(typeof (new Date()));


        //只能输出基本数据类型  不能输出复杂数据类型  

        //instanceof     

        // 数据结构 instanceof 构造函数 

        // 结果是 布尔类型  true  或者 false 
        // 基本包装 String  Number Boolean 

        // alert(123 instanceof String); // false 
        // alert([1,2,3] instanceof Array); //true
        // alert([1,2,3] instanceof Object); // true
        // alert(null instanceof Object); // false 
        // 优点 检测 复杂数据类型
        // 不能检测  null  undefined 
    



        // constructor 

        // 构造器  
        // 返回值  从哪里实例化出来的  
        // 缺点  不能检测  null 和 undefined  



        // Object.prototype.toString.call
        //  Object.prototype.toString.call(你要判断的数据结构)
        // 返回的结果是 [object 数据类型]
        // 能准确检测任意数据类型 



        // function Person(){
        //     console.log(123)
        // }

        // var p1 = new Person();

        // console.log(p1.constructor)

        // console.log([].constructor)
        // function test(){

        // }
        // console.log(test.constructor)

        // console.log({name:'zhangsan'}.constructor);

        // console.log(/\d/.constructor);
        // 如何利用 constructor 判断是否是数组

        // alert([].constructor === Array);
        // alert(/\d/.constructor === RegExp);




        console.log(Object.prototype.toString.call({}));
        console.log(Object.prototype.toString.call([]));
        console.log(Object.prototype.toString.call(123));
        console.log(Object.prototype.toString.call('123'));
        console.log(Object.prototype.toString.call(true));
        console.log(Object.prototype.toString.call(null));
        console.log(Object.prototype.toString.call(undefined));
        console.log(Object.prototype.toString.call(/\d/));
        console.log(Object.prototype.toString.call(new Date()));
        console.log(Object.prototype.toString.call(function(){}));

        /* 
        
        [object Object]
03判断数据类型.html:92 [object Array]
03判断数据类型.html:93 [object Number]
03判断数据类型.html:94 [object String]
03判断数据类型.html:95 [object Boolean]
03判断数据类型.html:96 [object Null]
03判断数据类型.html:97 [object Undefined]
03判断数据类型.html:98 [object RegExp]
03判断数据类型.html:99 [object Date]
03判断数据类型.html:100 [object Function]
        
        */


        console.log(Object.prototype.toString.call(/\D/) === '[object RegExp]');
        console.log(Object.prototype.toString.call([1,2,3]) === '[object Array]');













    </script>
</body>
</html>